home *** CD-ROM | disk | FTP | other *** search
/ Aminet 34 / Aminet 34 (2000)(Schatztruhe)[!][Dec 1999].iso / Aminet / comm / misc / SnoopTAT.lha / SnoopTAT / rexx / SnoopTAT.rexx < prev   
OS/2 REXX Batch file  |  1999-10-27  |  13KB  |  520 lines

  1. /*
  2.  
  3. Calcola il costo mensile dei collegamenti con il proprio Provider Internet.
  4.  
  5. $VER: SnoopTAT 1.0 (19.10.1999) By 41 (Marco Casavecchia :o) Codice ispirato ed in parte prelevato da "Scatti2.5" di Giovanni Addabbo.
  6.  
  7. */
  8.  
  9. sec = Time(s)
  10. giorno = Date(w)
  11. CALL SETTIMANA
  12. ora = Time(n)
  13. data = Date(e)
  14. cont = Date(i)
  15.  
  16. IF ~Exists('libs:rexxsupport.library') THEN DO
  17.     SAY 'Questo script richiede la rexxsupport.library'
  18.     EXIT
  19. END
  20.  
  21. IF ~Show('l','rexxsupport.library') THEN AddLib('rexxsupport.library',0,-30)
  22.  
  23. SIGNAL ON BREAK_C
  24.  
  25. IF Show('P','SNOOPTAT_MOSTRA') THEN DO
  26.     ADDRESS 'SNOOPTAT_MOSTRA'
  27.     'CALL BREAK_S'
  28. END
  29.  
  30.  
  31. /* Inizializza le Variabili */
  32. /**/
  33. esc = '1B'x;su = esc||'M';bold = esc||'[1m';plain = esc||'[0m'
  34. italic = esc||'[3m';bianco = esc||'[32m';nocurs = esc||'[0 p';
  35. nl = '0a'x;
  36. mostra = 'no';interv = 0;nul = 0
  37. par1 = '';par2 = '';par3 = '';par4 = '';config = ''
  38. iva = 0.19
  39. /**/
  40.  
  41. /* Ricava gli Argomenti */
  42. /**/
  43. ARG par
  44.  
  45. IF par = '?' THEN CALL USO
  46.  
  47. par = Translate(par,' ','=')
  48.  
  49. posB=Find(par,'BOOT'); IF posB=0 THEN posB=Find(par,'B')
  50. posM=Find(par,'MOSTRA'); IF posM=0 THEN posM=Find(par,'M')
  51. posC=Find(par,'CONFIG'); IF posC=0 THEN posC=Find(par,'C')
  52. /**/
  53.  
  54. /* Valuta gli Argomenti forniti */
  55. /**/
  56.  
  57. IF posM~=0 THEN DO
  58.     interv = SubWord(par,posm+1,1);IF Datatype(interv,'w') = 0 THEN CALL USO
  59.     mostra = 'si'
  60. END
  61.  
  62. IF posC~=0 THEN DO
  63.     config = SubWord(par,posc+1)
  64.     IF config ='' THEN CALL USO
  65. END
  66.  
  67. config = Strip(config,'b',' ''"')
  68. IF config = '' THEN config = 'ENV:SNOOPTAT.CFG'
  69.  
  70. IF ~Open('cfg',config,'r') THEN CALL ERRORE1(config)
  71. IF ReadLn('cfg') ~='CFG SNOOPTAT 1.0' THEN DO
  72.     SAY nl||bold'SnoopTAT: Errore!'plain
  73.     SAY italic'Il file 'config' non è un file di configurazione valido!!'plain
  74.     EXIT
  75. END
  76.  
  77. /**/
  78.  
  79.  
  80. /* Legge i dati dal file di configurazione */
  81. /**/
  82. temp = ReadLn('cfg')
  83. log = ReadLn('cfg')
  84. lav = ReadLn('cfg')
  85. int1 = ReadLn('cfg')
  86. int2 = ReadLn('cfg')
  87. not1 = ReadLn('cfg')
  88. not2 = ReadLn('cfg')
  89. form = UPPER(ReadLn('cfg'))
  90. sc = ReadLn('cfg')
  91. unit = ReadLn('cfg')
  92. con = ReadLn('cfg')
  93. pb = UPPER(ReadLn('cfg'))
  94. IF ~Close('cfg') THEN CALL ERRORE2(cfg)
  95.  
  96. IF Right(temp,1) ~= '/' & Right(temp,1) ~= ':' THEN temp = temp||'/'
  97. IF Right(log,1) ~= '/' & Right(log,1) ~= ':' THEN log = log||'/'
  98. IF Right(lav,1) ~= '/' & Right(lav,1) ~= ':' THEN lav = lav||'/'
  99.  
  100. temp2 = temp||'SnoopTAT_resume.tmp'
  101. temp = temp||'SnoopTAT.tmp'
  102. lasso = con
  103.  
  104. /* aggiunge l'IVA :( al costo dello scatto alla risposta */
  105. unit = unit + (unit * iva)
  106. /**/
  107.  
  108. /* Scrive il file temporaneo*/
  109. /**/
  110. CALL SCRIVETEMP
  111. /**/
  112.  
  113. IF posB ~= 0 THEN EXIT
  114.  
  115. /* Legge i dati dal file temporaneo */
  116. /**/
  117. IF ~Open('temp',temp,'r') THEN CALL ERRORE1(temp)
  118. cont0 = ReadLn('temp')
  119. sec0 = ReadLn('temp')                  /* legge i secondi da temp    */
  120. giorno = ReadLn('temp')                /* legge il giorno da temp    */
  121. ora = ReadLn('temp')                   /* legge l'ora da temp        */
  122. data = ReadLn('temp')                  /* legge la data da temp      */
  123. IF ~Close('temp') THEN CALL ERRORE2(temp)
  124. /**/
  125.  
  126. /* Verifica se è Domenica, Sabato o Festivo */
  127. /**/
  128.  
  129. TARIFFA:
  130.  
  131. data1 = Left(data,5)
  132.  
  133. SELECT
  134.     WHEN data1 = "13/04" THEN CALL FESTIVO()  /* Pasquetta: varia negli anni --> aggiustare */
  135.     WHEN data1 = "01/01" | data1 = "06/01" | data1 = "25/04" THEN CALL FESTIVO()
  136.     WHEN data1 = "01/05" | data1 = "15/08" | data1 = "01/11" | data1 = "25/12" | data1 = "26/12" THEN CALL FESTIVO()
  137.     WHEN giorno = "Domenica" THEN CALL FESTIVO()
  138.     WHEN giorno = "Sabato" THEN CALL SABATO()
  139.     OTHERWISE CALL FERIALE()
  140. END
  141.  
  142. IF mostra='si' THEN DO
  143.     IF ~Show('P','SNOOPTAT_MOSTRA') THEN porta = OpenPort('SNOOPTAT_MOSTRA')
  144.     IF ~Open('cons','CON:160/16/270/65/SnoopTAT 1.0 - Collegamento in Corso/INACTIVE/SMART/CLOSE/SCREENWorkbench','w') THEN DO
  145.         SAY nl||bold'SnoopTAT: Errore!!'plain
  146.         SAY italic'Non è possibile aprire la 'plain||bold'console'plain
  147.     END
  148.     CALL Writeln('cons',nocurs||nl||bianco'       Durata     Costo    Tariffa'plain)
  149.     CALL Writeln('cons','   ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯')
  150. END
  151.  
  152.  
  153. /*  Esegue i calcoli tempo, costo  */
  154. /**/
  155.  
  156. CALCOLI:
  157. IF cont>cont0 THEN sec = sec + ((cont-cont0)*24*3600)
  158. online = (sec - sec0) + con     /* durata connessione */
  159.  
  160.  
  161. IF online < 900 THEN DO
  162.    costo = TRUNC((online * tar1 / 60) + unit,1)   /*   Calcola il costo della chiamata */
  163.     scarto = sc % (tar1 / 60)
  164. END
  165. ELSE DO
  166.     costo = TRUNC((15 * tar1) + ((online-900) * tar2 / 60),1)
  167.     scarto = sc % (tar2 / 60)
  168. END
  169. minuti = online % 60
  170. secondi = online // 60
  171. ore = minuti % 60
  172. minuti = minuti // 60
  173.  
  174. /* Formula convenienza urbana */
  175.  
  176. IF form = 'URBANA' & online > ini  THEN DO
  177.     costo = TRUNC((ini * tar1 / 60) + (500 * tar1 / 60 / 2) + ((online-900) * tar2 / 60 /2) + unit,1)
  178.     scarto = scarto * 2
  179. END
  180.  
  181. /* Formula convenienza internet */
  182. /* NON ESISTE PIU'! */
  183.  
  184. costo = LEFT(costo,LENGTH(costo)-2) /* Tronca i decimali.. Telecom conferma :) */
  185.  
  186. /**/
  187.  
  188. /* Funzione Mostra Attiva - Visualizza Costo */
  189. /**/
  190.  
  191. IF mostra = 'si' THEN DO
  192.     CALL Writeln('cons','      'Right(ore,2,'0')':'Right(minuti,2,'0')':'Right(secondi,2,'0')'  'bold||Right(costo,7,' ')||plain'    '||form)
  193.     DELAY(interv*50)
  194.     lasso = lasso + interv
  195.     CALL Writeln('cons',Copies(su,2))
  196.     sec = Time('s')
  197.     cont = Date(i)
  198.     IF interv = 0 THEN EXIT
  199.     pack = GetPkt('SNOOPTAT_MOSTRA')
  200.     IF pack ~= null() THEN DO
  201.         com = GetArg(pack)
  202.         CALL Reply(pack,'0')
  203.         INTERPRET com
  204.     END
  205.     IF (lasso ~< scarto) THEN DO
  206.         lasso = 0
  207.         CALL SCRIVETEMP2()
  208.     END
  209.     CALL CALCOLI
  210. END
  211. /**/
  212.  
  213. /* Elabora i nomi dei file */
  214. /**/
  215.  
  216. AGGIORNA:
  217.  
  218. mese = substr(data,4)
  219.  
  220. appoggio = right(mese,2)
  221. IF appoggio ~< 2000 THEN DO
  222.     app = left(mese,2)||'_20'||appoggio
  223.     mese = left(mese,3)||'20'||appoggio
  224. END
  225. ELSE DO
  226.     app = left(mese,2)||'_19'||appoggio   /* stringa da appendere al nome del file */
  227.       mese = left(mese,3)||'19'||appoggio
  228. END
  229.  
  230. log1 = log||'SnoopTAT.log'                            /* nome file phonebill    */
  231. log = log||'Spese_'||app||'.log'                          /* nome file log          */
  232. lav = lav||'SnoopTAT.lav'                                /* nome file lavoro       */
  233.  
  234.  
  235. /* Se non esiste già, crea testatina file di log */
  236.  
  237. IF ~Exists(log) THEN DO
  238.         IF ~Open('log',log,'w') THEN CALL ERRORE1(log)
  239.         CALL WriteLn('log',Center('LOGFILE GENERATO DA SnoopTAT',72))
  240.         CALL WriteLn('log',Center('Realizzazione By 41 (Marco Casavecchia ;o)',72))
  241.         CALL Writeln('log','')
  242.         CALL WriteLn('log',Center('Dati relativi al mese: '||mese,72))
  243.         CALL Writeln('log','')
  244.         CALL WriteLn('log','    +------------+-----------+------------+--------------+----------+')
  245.         CALL WriteLn('log','    |    Data    |  Giorno   | Ora inizio |    Durata    |   Costo  |')
  246.         CALL WriteLn('log','    +------------+-----------+------------+--------------+----------+')
  247.         CALL WriteLn('log','#')
  248.         CALL WriteLn('log','#                                TOTALE       0h  0''  0"         0')
  249.         IF ~Close('log') THEN CALL ERRORE2(log)
  250. END
  251.  
  252. /* Scrive il file di lavoro */
  253.  
  254. IF ~Open('log',log,'r') THEN CALL ERRORE1(log)   /* Apre file log    */
  255. IF ~Open('lav',lav,'w') THEN CALL ERRORE1(lav)   /* Apre file lavoro */
  256.  
  257. DO UNTIL Left(ti,6) = 'TOTALE'
  258.     ti = ReadLn('log')
  259.     IF Left(ti,1) ~= '#' THEN CALL Writeln('lav',ti)  /* Copia su file lavoro */
  260.     ti = SubStr(ti,34,34)
  261. END
  262.  
  263. IF ~Close('log') THEN CALL ERRORE2(log)
  264. IF ~Close('lav') THEN CALL ERRORE2(lav)
  265.  
  266. appoggio = right(data0,2)
  267. IF appoggio ~< 2000 THEN
  268.     data0 = left(data0,6)||'20'||appoggio
  269. ELSE
  270.     data0 = left(data0,6)||'19'||appoggio
  271.  
  272. IF nul = 2 THEN DO
  273.     linea = '    | 'data0' | 'Center(giorno0,9)' |  'ora0'  |Chiamata Non Conteggiata |'
  274.     linea1 = '#                                'ti
  275.     CALL SCRIVE
  276.     RETURN
  277. END
  278.  
  279. /* Ricava i totali dal file di log */
  280.  
  281. totco = Strip(Right(ti,8))
  282. totore = Strip(SubStr(ti,12,3))
  283. totmin = Strip(SubStr(ti,17,2))
  284. totsec = Strip(SubStr(ti,21,2))
  285.  
  286. /* Calcola i nuovi totali */
  287.  
  288. totco = totco + costo
  289. totsec = totsec + secondi ; addmin = totsec % 60 ; totsec = totsec // 60
  290. totmin = addmin + minuti + totmin ; addore = totmin % 60 ; totmin = totmin //60
  291. totore = totore + ore + addore
  292.  
  293. totco = Right(totco,8,' ')
  294. totsec = Right(totsec,2,' ')
  295. totmin = Right(totmin,2,' ')
  296. totore = Right(totore,3,' ')
  297. totdur = totore'h 'totmin''' 'totsec'"'
  298. costo = Right(costo,8,' ')
  299. minuti = Right(minuti,2,' ')
  300. secondi= Right(secondi,2,' ')
  301. ore = Right(ore,3,' ')
  302.  
  303. /* Aggiorna il file di log */
  304.  
  305. durata = ore||'h 'minuti||"' "||secondi'"'
  306.  
  307. IF nul = 1 THEN
  308.     linea = '    | 'data0' | 'Center(giorno0,9)' |  'ora0'  | 'durata' | 'costo'*|'
  309. ELSE
  310.     linea = '    | 'data0' | 'Center(giorno0,9)' |  'ora0'  | 'durata' | 'costo' |'
  311. linea1 = '#                                TOTALE     'totdur'   'totco
  312.  
  313. SCRIVE:
  314.  
  315. IF ~Open('lav',lav,'a') THEN CALL ERRORE1(lav)
  316. CALL Writeln('lav',linea)
  317. CALL WriteLn('lav','    +------------+-----------+------------+--------------+----------+')
  318. CALL Writeln('lav','#')
  319. CALL WriteLn('lav',linea1)
  320. IF ~Close('lav') THEN CALL ERRORE2(lav)
  321. /**/
  322.  
  323. /* Copia il file di log, cancella i file temp e lav */
  324. /**/
  325.  
  326. ADDRESS command
  327. 'copy >nil:' lav log                   /* Copia il file lavoro su log */
  328. 'delete >nil:' lav                     /* Cancella file lavoro        */
  329. 'delete >nil:' temp                    /* Cancella file temporaneo    */
  330.  
  331. IF Exists(temp2) THEN DO
  332.     ADDRESS command
  333.     'delete >nil:' temp2
  334. END
  335.  
  336. IF nul >= 1 THEN DO
  337.     nul = 0
  338.     RETURN
  339. END
  340.  
  341. /**/
  342.  
  343. /* Scrive il file per phonebill */
  344. /**/
  345.  
  346. IF pb = 'si' THEN DO
  347.     IF Exists(log1) THEN DO
  348.         IF ~Open('log1',log1,'a') THEN CALL ERRORE1(log1)
  349.     END
  350.     ELSE DO
  351.         IF ~Open('log1',log1,'w') THEN CALL ERRORE1(log1)
  352.     END
  353.  
  354.     CALL Writeln('log1','>>> '||data||' '||ora||'    Inizio Sessione Internet')
  355.     CALL Writeln('log1','    'Date(e)' 'Time(n)'    Fine Sessione')
  356.     CALL Writeln('log1','')
  357.     IF ~Close('log1') THEN CALL ERRORE2(log1)
  358. END
  359. /**/
  360.  
  361. EXIT
  362.  
  363. /* Dati Varie Fascie Orarie */
  364. /**/
  365. FESTIVO:
  366.     tar1 = not1 + (not1 * iva)
  367.     tar2 = not2 + (not2 * iva)
  368.     ini = 400
  369. RETURN
  370.  
  371.  
  372. SABATO:
  373. IF ora >= "08:00:00" & ora < "13:00:00" THEN DO
  374.       tar1 = int1 + (int1 * iva)
  375.       tar2 = int2 + (int2 * iva)
  376.     ini = 220
  377. END
  378. ELSE DO
  379.       tar1 = not1 + (not1 * iva)
  380.       tar2 = not2 + (not2 * iva)
  381.     ini = 400
  382. END
  383. RETURN
  384.  
  385.  
  386. FERIALE:
  387. IF ora >= "08:00:00" & ora < "18:30:00" THEN DO
  388.       tar1 = int1 + (int1 * iva)
  389.       tar2 = int2 + (int2 * iva)
  390.     ini = 220
  391. END
  392. ELSE DO
  393.       tar1 = not1 + (not1 * iva)
  394.       tar2 = not2 + (not2 * iva)
  395.     ini = 400
  396. END
  397. RETURN
  398. /**/
  399.  
  400. /* Errore in Apertura/Chiusura File */
  401. /**/
  402.  
  403. ERRORE1:                                /* Non si può aprire il file */
  404. ARG file
  405. SAY nl||bold'SnoopTAT: Errore!!'plain
  406. SAY italic'Non è possibile aprire il file:'plain||bold' "'file'"'plain
  407. EXIT
  408.  
  409.  
  410. ERRORE2:                                /* Non si può chiudere il file */
  411. ARG file
  412. SAY nl||bold'SnoopTAT: Errore!!'plain
  413. SAY italic'Non è possibile chiudere il file:'plain||bold' "'file'"'plain
  414. EXIT
  415. /**/
  416.  
  417.  
  418. BREAK_C:
  419. CALL ClosePort(porta)
  420. ADDRESS COMMAND 'Delete >NIL: '||temp2
  421. EXIT
  422.  
  423. BREAK_S:
  424. CALL ClosePort(porta)
  425. EXIT
  426.  
  427. USO:
  428. SAY italic||nl'Uso:'plain||bold'  rx SnoopTAT.rexx B=BOOT/K M=Mostra/K/N, C=Config/K/F'plain
  429. EXIT
  430.  
  431.  
  432. /* Funzione Inizia Attiva - Scrive il file Temp */
  433. /**/
  434.  
  435. SCRIVETEMP:
  436.  
  437. /* Scrive il file temporaneo */
  438.  
  439. IF Exists(temp) THEN DO
  440.     IF ~Open('temp',temp,'r') THEN CALL ERRORE1(temp)
  441.     cont0=ReadLn('temp')
  442.     sec0=ReadLn('temp')
  443.     giorno0=ReadLn('temp')
  444.     ora0=ReadLn('temp')
  445.     data0=ReadLn('temp')
  446.     IF ~Close('temp') THEN CALL ERRORE2(temp)
  447.      sec1 = sec
  448.     IF cont>cont0 THEN sec1 = sec + ((cont-cont0)*24*3600)
  449.     IF (sec1-sec0) < 0 THEN DO
  450.         SAY nl||bold'SnoopTAT: Errore!!'plain
  451.         SAY italic'Il tuo computer deve avere qualche problema con l''orologio!!!'plain
  452.         IF ~Close('temp') THEN CALL ERRORE2(temp)
  453.         nul = 2
  454.         CALL AGGIORNA()
  455.         EXIT
  456.     END
  457.      IF posB ~= 0 THEN DO
  458.         /* Legge i dati dal secondo file temporaneo */
  459.          /**/
  460.          IF ~Open('temp2',temp2,'r') THEN DO
  461.               nul = 2
  462.            CALL AGGIORNA
  463.          END
  464.          ELSE DO
  465.             cont = ReadLn('temp2')
  466.             sec = ReadLn('temp2')                  /* legge i secondi da temp    */
  467.             IF ~Close('temp2') THEN CALL ERRORE2(temp)
  468.             /**/
  469.            nul = 1
  470.            mostra = 'no'
  471.            CALL TARIFFA()
  472.            EXIT
  473.         END
  474.     END
  475. END
  476. ELSE DO
  477.     IF posB ~= 0 THEN EXIT
  478.     IF ~Open('temp',temp,'w') THEN CALL ERRORE1(temp)
  479.     CALL WriteLn('temp',cont)
  480.     CALL WriteLn('temp',sec)
  481.     CALL WriteLn('temp',giorno)
  482.     CALL WriteLn('temp',ora)
  483.     CALL WriteLn('temp',data)
  484.     IF ~Close('temp') THEN CALL ERRORE2(temp)
  485.     CALL SCRIVETEMP2()
  486.      IF posM=0 THEN DO
  487.          ADDRESS command 'Delete >NIL: '||temp2
  488.          EXIT
  489.      END
  490. END
  491. RETURN
  492. /**/
  493.  
  494. /* Funzione per la creazione del secondo file di resume */
  495. /**/
  496.  
  497. SCRIVETEMP2:
  498.  
  499. /* Scrive il secondo file temporaneo */
  500.  
  501. IF ~Open('temp2',temp2,'w') THEN CALL ERRORE1(temp)
  502. CALL WriteLn('temp2',cont)
  503. CALL WriteLn('temp2',sec)
  504. IF ~Close('temp2') THEN CALL ERRORE2(temp2)
  505. RETURN
  506. /**/
  507.  
  508. SETTIMANA:
  509.  
  510. SELECT
  511.     WHEN giorno = 'Monday'      THEN giorno =   'Lunedì'
  512.     WHEN giorno = 'Tuesday'     THEN giorno =   'Martedì'
  513.     WHEN giorno = 'Wednesday'   THEN giorno =   'Mercoledì'
  514.     WHEN giorno = 'Thursday'    THEN giorno =   'Giovedì'
  515.     WHEN giorno = 'Friday'      THEN giorno =   'Venerdì'
  516.     WHEN giorno = 'Saturday'    THEN giorno =   'Sabato'
  517.     WHEN giorno = 'Sunday'      THEN giorno =   'Domenica'
  518. END
  519. RETURN
  520.